#include "ioOTA.h"
#include <ESP8266HTTPClient.h>
#include <ESP8266httpUpdate.h>
#include <ESP8266WiFi.h>
#include "ioMQTT.h"
#include "ioUDP.h"

extern StaticJsonDocument<1024> udppack;

/************************************************************************
* 函数名称: update_started()
* 输入参数: 无
* 返回值  : 无
* 功    能: 更新启动
**********************************************************************/
void update_started()
{
    DEBUGLN("CALLBACK:  HTTP update process started");
}
/************************************************************************
* 函数名称: update_finished()
* 输入参数: 无
* 返回值  : 无
* 功    能: 更新完成
**********************************************************************/
void update_finished()
{
    DEBUGLN("CALLBACK:  HTTP update process finished");
}
/************************************************************************
* 函数名称: update_progress()
* 输入参数: 无
* 返回值  : 无
* 功    能: 更新过程
**********************************************************************/
void update_progress(int cur, int total)
{
    udppack.clear();
    udppack["cmd"] = "update_per";
    udppack["per"] = cur * 100 / total;
    returnUDP(&udppack);
    DEBUGF("CALLBACK:  HTTP update process at %d bytes...\n", udppack["per"]);
}
/************************************************************************
* 函数名称: update_error()
* 输入参数: 无
* 返回值  : 无
* 功    能: 更新失败
**********************************************************************/
void update_error(int err)
{
    DEBUGF("CALLBACK:  HTTP update fatal error code %d\n", err);
}
/************************************************************************
* 函数名称: versionCheck()
* 输入参数: 无
* 返回值  : 无
* 功    能: 版本检查
**********************************************************************/
void versionCheck()
{
}

/************************************************************************
* 函数名称: otaUpdate()
* 输入参数: 无
* 返回值  : 无
* 功    能: 开启ota更新固件
**********************************************************************/
void otaUpdate(String url)
{
    WiFiClient client;
    // Add optional callback notifiers
    ESPhttpUpdate.onStart(update_started);
    ESPhttpUpdate.onEnd(update_finished);
    ESPhttpUpdate.onProgress(update_progress);
    ESPhttpUpdate.onError(update_error);

    t_httpUpdate_return ret = ESPhttpUpdate.update(client, url);

    switch (ret)
    {
    case HTTP_UPDATE_FAILED:
        DEBUGF("HTTP_UPDATE_FAILD Error (%d): %s\n", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
        break;

    case HTTP_UPDATE_NO_UPDATES:
        DEBUGLN("HTTP_UPDATE_NO_UPDATES");
        break;

    case HTTP_UPDATE_OK:
        DEBUGLN("HTTP_UPDATE_OK");
        break;
    }
}